package internal
import (
"encoding/binary"
"io"
)
type ByteInput interface {
Next (n int ) ([]byte , error )
NextReturnsSafeSlice () bool
ReadUInt32 () (uint32 , error )
ReadUInt16 () (uint16 , error )
GetReadBytes () int64
SkipBytes (n int ) error
}
func NewByteInputFromReader (reader io .Reader ) ByteInput {
return &ByteInputAdapter {
r : reader ,
readBytes : 0 ,
}
}
func NewByteInput (buf []byte ) ByteInput {
return &ByteBuffer {
buf : buf ,
off : 0 ,
}
}
type ByteBuffer struct {
buf []byte
off int
}
func NewByteBuffer (buf []byte ) *ByteBuffer {
return &ByteBuffer {
buf : buf ,
}
}
var _ io .Reader = (*ByteBuffer )(nil )
func (b *ByteBuffer ) Read (p []byte ) (int , error ) {
data , err := b .Next (len (p ))
if err != nil {
return 0 , err
}
copy (p , data )
return len (data ), nil
}
func (b *ByteBuffer ) Next (n int ) ([]byte , error ) {
m := len (b .buf ) - b .off
if n > m {
return nil , io .ErrUnexpectedEOF
}
data := b .buf [b .off : b .off +n ]
b .off += n
return data , nil
}
func (b *ByteBuffer ) NextReturnsSafeSlice () bool {
return false
}
func (b *ByteBuffer ) ReadUInt32 () (uint32 , error ) {
if len (b .buf )-b .off < 4 {
return 0 , io .ErrUnexpectedEOF
}
v := binary .LittleEndian .Uint32 (b .buf [b .off :])
b .off += 4
return v , nil
}
func (b *ByteBuffer ) ReadUInt16 () (uint16 , error ) {
if len (b .buf )-b .off < 2 {
return 0 , io .ErrUnexpectedEOF
}
v := binary .LittleEndian .Uint16 (b .buf [b .off :])
b .off += 2
return v , nil
}
func (b *ByteBuffer ) GetReadBytes () int64 {
return int64 (b .off )
}
func (b *ByteBuffer ) SkipBytes (n int ) error {
m := len (b .buf ) - b .off
if n > m {
return io .ErrUnexpectedEOF
}
b .off += n
return nil
}
func (b *ByteBuffer ) Reset (buf []byte ) {
b .buf = buf
b .off = 0
}
type ByteInputAdapter struct {
r io .Reader
readBytes int
buf [4 ]byte
}
var _ io .Reader = (*ByteInputAdapter )(nil )
func (b *ByteInputAdapter ) Read (buf []byte ) (int , error ) {
m , err := io .ReadAtLeast (b .r , buf , len (buf ))
b .readBytes += m
if err != nil {
return 0 , err
}
return m , nil
}
func (b *ByteInputAdapter ) Next (n int ) ([]byte , error ) {
buf := make ([]byte , n )
_ , err := b .Read (buf )
if err != nil {
return nil , err
}
return buf , nil
}
func (b *ByteInputAdapter ) NextReturnsSafeSlice () bool {
return true
}
func (b *ByteInputAdapter ) ReadUInt32 () (uint32 , error ) {
buf := b .buf [:4 ]
_ , err := b .Read (buf )
if err != nil {
return 0 , err
}
return binary .LittleEndian .Uint32 (buf ), nil
}
func (b *ByteInputAdapter ) ReadUInt16 () (uint16 , error ) {
buf := b .buf [:2 ]
_ , err := b .Read (buf )
if err != nil {
return 0 , err
}
return binary .LittleEndian .Uint16 (buf ), nil
}
func (b *ByteInputAdapter ) GetReadBytes () int64 {
return int64 (b .readBytes )
}
func (b *ByteInputAdapter ) SkipBytes (n int ) error {
_ , err := b .Next (n )
return err
}
func (b *ByteInputAdapter ) Reset (stream io .Reader ) {
b .r = stream
b .readBytes = 0
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .